import multi.*;

/**
    多态性，其实就是一句话：父类引用指向子类对象。
    格式： 父类名称 对象名 = new 子类名称();

    口诀:
        成员变量：编译看左边，运行还看左边。
        成员方法：编译看左边，运行看右边。
-------------------------------------------------------------
    向上转型一定是安全的。但是也有一个弊端：
    对象一旦向上转型为父类，那么就无法调用子类原本特有的内容。
    解决方案：用对象的向下转型【还原】。

 */
public class Demo01Multi {

    public static void main(String[] args) {

        /*-----使用多态的写法------------*/
        // 左侧父类的引用，指向了右侧子类的对象
        Fu obj = new Zi();

        System.out.println(obj.num); // 父：10
//        System.out.println(obj.age); // 错误写法！

        obj.showNum();   //父子都有,优先用子
        obj.method();    //父子都有,优先用子
        obj.methodFu();  //子类没有,调用父类的方法

        /*-----多态向上类型和向下类型转换------------*/
        // 对象的向上转型，就是：父类引用指向之类对象。
        Animal animal = new Cat(); // 本来创建的时候是一只猫
        animal.eat(); // 猫吃鱼

        // 向下转型，进行“还原”动作
        Cat cat = (Cat) animal;
        cat.catchMouse(); // 猫抓老鼠

        // 下面是错误的向下转型
        // 本来new的时候是一只猫，现在非要当做狗
        // 编译不会报错，但是运行会java.lang.ClassCastException，类转换异常
        Dog dog = (Dog) animal;
    }
}
